import ar.com.binarit.Person
import ar.com.binarit.Role
import ar.com.binarit.entities.Concepto
import ar.com.binarit.entities.Division
import ar.com.binarit.entities.Equipo
import ar.com.binarit.entities.Estado
import ar.com.binarit.entities.EstadoCalificacion
import ar.com.binarit.entities.EstadoPago
import ar.com.binarit.entities.Pais
import ar.com.binarit.entities.ParametrosSistema
import ar.com.binarit.entities.TipoCalificacion
import ar.com.binarit.entities.TipoDocumento
import ar.com.binarit.entities.TipoEvento
import ar.com.binarit.entities.TipoLugar
import ar.com.binarit.entities.TipoPago
import ar.com.binarit.entities.TipoUsuario




class BootStrap {

    def init = { servletContext ->
		
//		crearEquipos()
		
		if (Role.count()==0){
			new Role(authority: 'ROLE_ADMIN', description: 'Admin role').save(flush: true, failOnError: true)
			new Role(authority: 'ROLE_FACEBOOK', description: 'Admin role').save(flush: true, failOnError: true)
			new Role(authority: 'ROLE_USER', description: 'Admin role').save(flush: true, failOnError: true)
		}
		
		if (TipoUsuario.count()==0){
			new TipoUsuario(descripcion: TipoUsuario.ADMINISTRADOR, version: 0).save(flush: true, failOnError: true)
			new TipoUsuario(descripcion: TipoUsuario.MODERADOR, version: 0).save(flush: true, failOnError: true)
			new TipoUsuario(descripcion: TipoUsuario.NORMAL, version: 0).save(flush: true, failOnError: true)
		}
		
		if (TipoLugar.count()==0){
			new TipoLugar(descripcion: TipoLugar.MI_CASA, version: 0).save(flush: true, failOnError: true)
			new TipoLugar(descripcion: TipoLugar.MI_TRABAJO, version: 0).save(flush: true, failOnError: true)
			new TipoLugar(descripcion: TipoLugar.OTRO, version: 0).save(flush: true, failOnError: true)
		}
		
		if (TipoCalificacion.count()==0){
			new TipoCalificacion(descripcion: TipoCalificacion.POSITIVA, version: 0).save(flush: true, failOnError: true)
			new TipoCalificacion(descripcion: TipoCalificacion.NEGATIVA, version: 0).save(flush: true, failOnError: true)
			new TipoCalificacion(descripcion: TipoCalificacion.NEUTRA, version: 0).save(flush: true, failOnError: true)
		}
		
		if (TipoEvento.count()==0){
			new TipoEvento(descripcion: TipoEvento.ALTA_USUARIO, opcional: true).save(flush: true, failOnError: true)
			new TipoEvento(descripcion: TipoEvento.NUEVO_VIAJE, opcional: true).save(flush: true, failOnError: true)
			new TipoEvento(descripcion: TipoEvento.VIAJE_ELIMINADO, opcional: true).save(flush: true, failOnError: true)
			new TipoEvento(descripcion: TipoEvento.USUARIO_ELIMINADO, opcional: true).save(flush: true, failOnError: true)
			new TipoEvento(descripcion: TipoEvento.VIAJE_ELIMINADO_A_MEDIAS, opcional: true).save(flush: true, failOnError: true)
		}
		
		if (Estado.count()==0){
			new Estado(descripcion: Estado.ABIERTO, version: 0).save(flush: true, failOnError: true)
			new Estado(descripcion: Estado.CERRADO, version: 0).save(flush: true, failOnError: true)
			new Estado(descripcion: Estado.ELIMINADO, version: 0).save(flush: true, failOnError: true)
		}
		
		if (EstadoCalificacion.count()==0){
			new EstadoCalificacion(descripcion: EstadoCalificacion.PENDIENTE, version: 0).save(flush: true, failOnError: true)
			new EstadoCalificacion(descripcion: EstadoCalificacion.CERRADO, version: 0).save(flush: true, failOnError: true)
		}
		
		if(ParametrosSistema.count()==0){
			new ParametrosSistema(cantidadUsuariosDestacados: 10, mubbiasPorConcretar: 5, mubbiasCerradas: 5).save(flush: true, failOnError: true)
		}
		
		if (EstadoPago.count()==0){
			new EstadoPago(descripcion: EstadoPago.APROBADO, version: 0).save(flush: true, failOnError: true)
			new EstadoPago(descripcion: EstadoPago.PENDIENTE, version: 0).save(flush: true, failOnError: true)
			new EstadoPago(descripcion: EstadoPago.EN_PROCESO, version: 0).save(flush: true, failOnError: true)
			new EstadoPago(descripcion: EstadoPago.RECHAZADO, version: 0).save(flush: true, failOnError: true)
			new EstadoPago(descripcion: EstadoPago.DEVUELTO, version: 0).save(flush: true, failOnError: true)
			new EstadoPago(descripcion: EstadoPago.CANCELADO, version: 0).save(flush: true, failOnError: true)
			new EstadoPago(descripcion: EstadoPago.EN_MEDIACION, version: 0).save(flush: true, failOnError: true)
		}
		
		if (TipoPago.count()==0){
			new TipoPago(descripcion: TipoPago.TARJETA, version: 0).save(flush: true, failOnError: true)
			new TipoPago(descripcion: TipoPago.TRANSFERENCIA_BANCARIA, version: 0).save(flush: true, failOnError: true)
			new TipoPago(descripcion: TipoPago.CUENTA, version: 0).save(flush: true, failOnError: true)
			new TipoPago(descripcion: TipoPago.TICKET, version: 0).save(flush: true, failOnError: true)
		}
		
		if (TipoDocumento.count() == 0) {
			new TipoDocumento(descripcion: "DU").save(failOnError: true)
			new TipoDocumento(descripcion: "CUIT").save(failOnError: true)
			new TipoDocumento(descripcion: "CUIL").save(failOnError: true)
		}
		
		if (Concepto.count() == 0) {
			new Concepto(descripcion: "Pago de viaje").save(failOnError: true)
			new Concepto(descripcion: "Deuda").save(failOnError: true)
		}
		
		crearUsuarioAdministrador()
		
    }
    def destroy = {
    }
	
	def crearUsuarioAdministrador(){
		def hayAdministrador = Person.findByTipoUsuario(TipoUsuario.administrador())
		if (!hayAdministrador){
			new Person(nombre: "VALC", apellido: "SRL", email: ParametrosSistema.first().mailSistema, username:"VALC", password:"12valc21",
				nickname:"Vamos a la cancha!", tipoUsuario: TipoUsuario.administrador(), version: 0, enabled: true,
				usuarioVerificado: true, imgAvatar: "https://twimg0-a.akamaihd.net/profile_images/2909011660/0db5c60b05f09d1941217e8c2811d03e.png").save(flush: true, failOnError: true)
		}
	}
	
	def obtenerPais(){
		def pais
		if (Pais.count() == 0) {
			pais = new Pais(descripcion: "Argentina", divisiones: []).save(flush: true, failOnError: true)
		}else{
			pais = Pais.findByDescripcion("Argentina")
		}
		return pais
	}
	
	def obtenerDivision(pais){
		def divisionPrimeraA
		if (Division.count() == 0) {
			divisionPrimeraA = new Division(descripcion: "Primera")
			divisionPrimeraA.pais = pais
			divisionPrimeraA.pais.id = pais.id
			divisionPrimeraA.equipos = []
			println divisionPrimeraA
			divisionPrimeraA.properties.each{
				println it
			}
			divisionPrimeraA.save(failOnError: true)
		}else{
			divisionPrimeraA = Division.findByDescripcion("Primera")
		}
		return divisionPrimeraA
	}
	def crearEquipos(){
		def boca
		def river
		def independiente
		def velez
		List divisiones
		List equipos
		
		def pais = obtenerPais()
		println "pais: " + pais + "-"+ pais.id
		def	divisionPrimeraA = obtenerDivision(pais)
		
		divisiones = [divisionPrimeraA]

		if (Equipo.count() == 0) {
			boca = new Equipo(nombre: "Boca", direccion:"Brandsen 805, Capital Federal, Argentina", posicionGeografica:"-34.636631,-58.364742", apodoDeLaCancha:"La Bombonera", escudo:"http://www.soyboca.com.ar/images/escudos/boca.png", division: divisionPrimeraA).save(failOnError: true)
			river = new Equipo(nombre: "River", direccion:"Acceso A Pres. Figueroa Alcorta 7597, Buenos Aires, Argentina", posicionGeografica:"-34.546666,-58.449468", apodoDeLaCancha:"El Monumental", escudo:"http://www.soyboca.com.ar/images/escudos/riverplate.png", division: divisionPrimeraA).save(failOnError: true)
			independiente = new Equipo(nombre: "Independiente", direccion:"Enrique Ricardo Bochini 751, Avellaneda, Buenos Aires, Argentina", posicionGeografica:"-34.546666,-58.449468 ", apodoDeLaCancha:"El Libertadores de America", escudo:"http://www.soyboca.com.ar/images/escudos/independiente.png", division: divisionPrimeraA).save(failOnError: true)
			velez = new Equipo(nombre: "Velez", direccion:"	Avenida Juan B. Justo 9200, Capital Federal, Argentina", posicionGeografica:"-34.546666,-58.449468 ", apodoDeLaCancha:"Jose Amalfitani", escudo:"http://www.soyboca.com.ar/images/escudos/velezsarfield.png", division: divisionPrimeraA).save(failOnError: true)
		}
		equipos = [boca, river, independiente, velez]
		
		pais.divisiones = divisiones
//			divisionPrimeraA.pais = divisionPrimeraA
		divisionPrimeraA.equipos = equipos
		pais.save(failOnError: true)
		divisionPrimeraA.save(failOnError: true)
	}
}
